package com.mandala;

import java.util.Hashtable;
import java.util.Properties;

import javax.naming.Context;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.ldap.LdapContext;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import com.mandala.utils.PropertyUtil;
@Service
public class LDAPConnectService {

	protected Logger logger = LoggerFactory.getLogger(getClass());


	
    /**
     * LDAP验证用户登录
     * @param userName
     * @param password
     * @return
     */
    public boolean connectLdap() {
    	PropertyUtil propertyUtil = new PropertyUtil();
    	String LDAP_URL = propertyUtil.getProperty("spring.ldap.urls");
    	String BASEDN = propertyUtil.getProperty("spring.ldap.base");
    	String FACTORY = propertyUtil.getProperty("spring.ldap.factory");
    	String userName = propertyUtil.getProperty("spring.ldap.username");
    	String password = propertyUtil.getProperty("spring.ldap.password");
        boolean bRtn = false;// 标注是否验证成功，初始为false 
        Hashtable<String, String> env = new Hashtable<String, String>();
        // LDAP 服务器的 URL 地址，
        //env 中的key都是固定值在 javax.naming.Context 类中
        env.put(Context.INITIAL_CONTEXT_FACTORY,FACTORY);// ldapCF
        env.put(Context.PROVIDER_URL, LDAP_URL);// ldapURL
        env.put(Context.SECURITY_AUTHENTICATION, "simple"); // ldapAuthMode
        //username和对应的password怎么在LDAP服务器中设置，我也不知道
        //通过默认的用户名"cn=manager,dc=aaa,dc=bbb"(aaa、bbb的具体值要在配置文件中配置，具体看参考博文)和密码"secret",可以测试连接是否成功
        env.put(Context.SECURITY_PRINCIPAL, userName);
        env.put(Context.SECURITY_CREDENTIALS, password);
        DirContext ctx = null;
        try {
            //这条代码执行成功就是验证通过了，至于为什么我也不知道
            ctx = new InitialDirContext(env);
            bRtn = true;
            logger.info("Ldap验证通过!");
        } catch (Exception ex) {
            logger.error("Ldap 初始化 出错:", ex);
        } finally {
            try {
                if (ctx != null) {
                    ctx.close();
                    ctx = null;
                }
                env.clear();
            } catch (Exception e) {
                logger.error("Ldap context close出错:", e);
            }
        }
        
        //验证成功返回 true，验证失败返回false
        return bRtn;
    }
}

